package ma.ensao.egicom.bank.services.dao.interfaces;

import java.util.Map;

import ma.ensao.egicom.bank.services.model.Account;
import ma.ensao.egicom.bank.services.model.CreditCard;

/**
 * Interface d'acc&egrave;s aux donn&eacute;es pour l'entit&eacute; persistante <code>CreditCard</code>.
 * @author MILHI Yassine (milhi.yassinee@gmail.com)
 */
public interface CreditCardDao {

    /**
     * Cr&eacute;&eacute; une carte de Cr&eacute;dit.
     * @param creditCard le compte à cr&eacute;er
     */
    void createCreditCard(CreditCard creditCard);

    /**
     * Supprime une carte de cr&eacute;dit
     * @param crediCard la carte de cr&eacute;dit à supprimer
     */
    void deleteCreditCard(CreditCard crediCard);

    /**
     * R&eacute;cup&egrave;re la carte de cr&eacute;dit correspondante à l'identifiant unique sp&eacute;cifi&eacute;.
     * @param idCard identifiant de la carte de cr&eacute;dit
     * @return la carte de cr&eacute;dit trouv&eacute;e
     */
    CreditCard getCreditCardById(Long idCard);

    /**
     * Retourne la carte de cr&eacute;dit unique qui respect le filtre.
     * @param propertyName le nom de la proprit&eacute; dans la table
     * @param value la valeur à filter avec
     * @return une liste des cartes de cr&eacute;dits qui respectent le filtre
     */
    CreditCard getCreditCardByProperty(String propertyName, Object value);

    /**
     * Retourne la carte de cr&eacute;dit unique qui respect le filtre.
     * @param properties une map des propri&eacute;tes cl&eacute;(le nom de la propri&eacute;t&eacute;) / valeur (La valeur de la propri&eacute;t&eacute;).
     * @return une liste des cartes de cr&eacute;dits qui respectent le filtre
     */
    CreditCard getCreditCardByProperties(Map<String, Object> properties);

    /**
     * Retourne le compte associ&eacute; à cette carte de cr&eacute;dit.
     * @param propertyName le nom de la proprit&eacute; dans la table
     * @param value la valeur à filter avec
     * @return une liste des compte qui respectent le filtre
     */
    Account getAccountOfCreditCard(String propertyName, Object value);

}
